#include "mywidget.h"

MyWidget::MyWidget(QWidget *parent)
    : QWidget{parent}
{
}



void MyWidget::closeEvent(QCloseEvent *event)
{
    // 2. 找到父窗口（主窗口）并显示
    if (this->parentWidget() != nullptr)
    {
        // 将父指针强转为 QWidget*（因创建时父指针就是主窗口，强转安全）
        QWidget *panret = qobject_cast<QWidget*>(this->parentWidget());

        if (panret != nullptr)
        {
            this->hide();
            qDebug() << "【子窗口】已隐藏";
            panret->show(); // 显示主窗口
            qDebug() << "【程序父窗口】主窗口已显示";
        }
        else
        {
            qDebug() << "【父窗口类型错误】";
        }
    }
    else
    {
        qDebug() << "【未找到】父窗口（主窗口）";
        qDebug() << "【警告】:无法回到父窗口,可能是窗体创建的时,没有指明父对象!";
    }

    // 3. 忽略默认关闭事件（关键！阻止Qt销毁子窗口）
    event->ignore();
}

int MyWidget::getMyProperty() const
{
    return m_myProperty;
}

void MyWidget::setMyProperty(int newMyProperty)
{
    if (m_myProperty == newMyProperty)
        return;
    m_myProperty = newMyProperty;
    emit myPropertyChanged();
}

void MyWidget::Meta_Fun()
{
    qDebug() << "I Am Meta_Fun!";
}

void MyWidget::Slot_Fun()
{
    qDebug() << "I Am Slot_Fun!";
}

// 如何访问父对象的属性。
// 1.如何访问付对象的属性
// 2.如何访问父对象的方法
// Qt 的元对象系统允许通过以下方式动态访问对象的属性和方法：
//     属性系统：通过 QObject::property() 读取属性值，QObject::setProperty() 设置属性值（需在类中用 Q_PROPERTY 声明属性）。
//     元方法调用：通过 QMetaObject::invokeMethod() 动态调用对象的方法（需方法在元对象系统中注册，如 public slots 或用 Q_INVOKABLE 声明）。
//     这种方式的优势是：子窗口无需包含父窗口的头文件，仅需知道父窗口的属性名或方法名，即可实现交互（解耦父窗口类型依赖）。





// 以下是父窗口中需要添加的文本.

// QWidget* Widget::findChildWindowByClassName(const QString& target_class_name)
// {
//     // 1. 遍历主窗口的直接子对象（子窗口必须是主窗口的直接孩子，避免查找到子控件）
//     // 若子窗口是嵌套的，可将 Qt::FindDirectChildrenOnly 改为 Qt::FindChildrenRecursively
//     QList<QObject*> all_direct_children = this->findChildren<QObject*>(QString(),Qt::FindDirectChildrenOnly);

//     // 2. 按类名匹配查找子窗口
//     foreach (QObject* child_obj, all_direct_children)
//     {
//         // 获取子对象的完整类名（需与子窗口类名完全一致，区分大小写）
//         QString child_class_name = child_obj->metaObject()->className();
//         if (child_class_name == target_class_name)
//         {
//             // 类名匹配，强转为QWidget*（子窗口均为QWidget派生类）
//             return qobject_cast<QWidget*>(child_obj);
//         }
//     }

//     // 3. 未找到返回nullptr
//     qDebug() << "[MainWindow] 未找到子窗口：" << target_class_name;
//     return nullptr;
// }


// 按钮方法,创建子窗口
// void Widget::on_pushButton_clicked()
// {
//     // -------------------------- 需自定义的2处内容 --------------------------
//     const QString TARGET_CHILD_CLASS = "Form"; // 【自定义1】：子窗口完整字符串类名（如"DataProcessWindow"）
//     typedef Form ChildWindowType;              // 【自定义2】：子窗口类型（如DataProcessWindow）
//     // -----------------------------------------------------------------------

//     // 1. 按类名查找子窗口实例
//     QWidget* child_window = findChildWindowByClassName(TARGET_CHILD_CLASS);

//     // 2. 未找到实例 → 新建子窗口（加入主窗口对象树）
//     if (!child_window)
//     {
//         child_window = new ChildWindowType(this); // 父指针=主窗口，自动加入对象树
//         // 设置子窗口为独立窗口（有标题栏、可关闭）
//         child_window->setWindowFlags(Qt::Window);
//         // 双重保险：关闭时不销毁子窗口（默认false，手动加更稳妥）
//         child_window->setAttribute(Qt::WA_DeleteOnClose, false);
//         qDebug() << "[MainWindow] 新建子窗口：" << TARGET_CHILD_CLASS;
//     }

//     // 3. 显示子窗口，隐藏主窗口
//     this->hide();
//     child_window->show();
//     // （可选）子窗口显示时置顶（根据需求添加）
//     child_window->raise();

// }


